package commonClass;

import java.sql.SQLOutput;

/**
 * 字符串练习
 */
public class StringExercise01 {

    public static void main(String[] args) {

        String a = "abc";
        String b = "abc";
        System.out.println(a.equals(b));//T 值相同
        System.out.println(a == b);//T 地址相同都指向常量池"abc"空间

        String aa = new String("abc");
        String bb = new String("abc");
        System.out.println(aa.equals(bb));//T 值相同
        System.out.println(aa == bb);//F 地址指向不同的堆内的String对象

        String aaa = "abc"; // 指向常量池"abc"空间
        String bbb = new String("abc"); //指向堆内bbb对象
        System.out.println(aaa.equals(bbb));//T 值相同
        System.out.println(aaa == bbb); // F 地址不同
        System.out.println(aaa == bbb.intern());//T bbb.intern() 返回常量池的地址
        System.out.println(bbb == bbb.intern());//F
        /*
            intern方法
            当调用 intern方法时，如果池中已经包含一个等于此String对象的字符串(用equals(Object)确定)，
            则返回池中的字符串。否则，将此 String 对象添加到池中，并返回此 String 对象的引用
            bbb.intern() 最终返回的是常量池的地址
         */

        String s1 = "lmy";
        String s2 = "java";
        String s4 = "java";
        String s3 = new String("java");
        System.out.println(s2 == s3);//F
        System.out.println(s2 == s4);//T
        System.out.println(s2.equals(s3));//T
        System.out.println(s1 == s2);//F

        Person p1 = new Person();
        p1.name = "lmy";
        Person p2 = new Person();
        p2.name = "lmy";

        System.out.println(p1.name.equals(p2.name));//T
        System.out.println(p1.name == p2.name);//T 都指向常量池"lmy"空间
        System.out.println(p1.name == "lmy");//T  都指向常量池"lmy"空间

        String ss1 = new String("bcde");
        String ss2 = new String("bcde");
        System.out.println(ss1 == ss2);//F
    }
}

class Person {

    public String name;
}